#include <iostream>

void func(int &a)
{
    std::cout << "void func(int &a)" << std::endl;
    std::cout << "a = " << a << std::endl;
}

void func(const int &a)
{
    std::cout << "void func(const int &a)" << std::endl;
    std::cout << "a = " << a << std::endl;
}

/*
    常量引用：可以引用常量对象，和非常量对象
    非常量引用： 可以引用非常量对象
*/

int main(int argc, char const *argv[])
{
    const int a = 100;
    int b = 100;
    // int &d = a; 非常量引用不能引用常量int （常量对象）
    const int &d = a;
    int &e = b;
    std::cout << "****************"
              << "func(a); " << std::endl;
    func(a); // void func(const int &a)
    std::cout << "****************"
              << "func(b);" << std::endl;
    func(b); // void func(int &a)
    std::cout << "****************"
              << "func(100);" << std::endl;
    func(100); // void func(const int &a)
    std::cout << "****************"
              << "func(d);" << std::endl;
    func(d); // void func(const int &a)
    std::cout << "****************"
              << "func(e);" << std::endl;
    func(e); // void func(int &a)

    /*
       同时存在时:常量找常量，非常量找非常量
       只有常量参数存在时，所有的都找这一个函数
       只有非常量参数存在时，常量作为参数时会报错，
       注意：字面量，属于常量
    */
    return 0;
}
